﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.Enums;
using ComunesMGI.Excepciones;

namespace ComunesMGI.Condiciones
{
    [Serializable()]
    public class Condicion
    {
        private OperadorLogico _operador;
        private string _nombreCampo;
        private bool _estricto;
        private string _valor;
        private CampoSharepoint _tipo;

        public Condicion(OperadorLogico operador, string nombreCampo, bool estricto, string valor, CampoSharepoint tipo)
        {
            if (tipo == CampoSharepoint.Choice && !((operador == OperadorLogico.Igual) || (operador == OperadorLogico.Distinto)))
            {
                throw new CondicionInvalidaException("Para condicion de tipo choice solo aplican los operadores igual o distinto");
            }
            this._operador = operador;
            this._estricto = estricto;
            this._nombreCampo = nombreCampo;
            this._valor = valor;
            this._tipo = tipo;

        }

        public  string GetNombreCampo()
        {
            return _nombreCampo;
        }

        public bool Evaluar(string valor) 
        {
            if (!_estricto &&  String.IsNullOrEmpty(valor) )
            {
                return true;
            } 
            else
            {
                if (String.IsNullOrEmpty(valor))
                    return false;
                else
                {
                    switch (this._tipo)
                    {
                        case CampoSharepoint.DateTime:
                            DateTime fechaValor = DateTime.ParseExact(valor,Constantes.ConstantesMGI.FormatoFechas,null);
                            switch (_operador)
                            {
                                case OperadorLogico.Igual:
                                    return fechaValor.Equals(_valor);
                                case OperadorLogico.Mayor:
                                    return (fechaValor.CompareTo(_valor) > 0);
                                case OperadorLogico.MayorIgual:
                                    return (fechaValor.CompareTo(_valor) >= 0);
                                case OperadorLogico.Menor:
                                    return (fechaValor.CompareTo(_valor) < 0);
                                case OperadorLogico.MenorIgual:
                                    return (fechaValor.CompareTo(_valor) <= 0);
                                case OperadorLogico.Distinto:
                                    return (!fechaValor.Equals(_valor));


                            }
                            return false;
                        case CampoSharepoint.Choice:
                            if (this._operador == OperadorLogico.Igual)
                                return _valor.ToUpper().Equals(valor.ToUpper());
                            else if (this._operador == OperadorLogico.Distinto)
                                return !(_valor.ToUpper().Equals(valor.ToUpper()));
                            return false;
                        default:
                            throw new Exception("Solo esta implemetado condiciones para Choice y DateTime");
                    }
                    
                    
                }
            }
        } 
    }
}
